package com.xiyuan.smartutils.api.annotation;

import java.lang.annotation.*;

/**
 * the description for class ApiField
 *
 * @author xiyuan-lgz 2024-04-04 @version v1.0.0 新建与整理
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface ApiField {
    
    /**
     * 包裹字段名：
     * 如：
     * <pre>
     *     class A{
     *         @ ApiField(wrap="wrapper", value="codes")
     *         private int[] values = new int[]{1, 2, 3};
     *         int value2 = 2;
     *     }
     *     // 那么 A 对象 转成 json 后格式如下：
     *     {
     *         wrapper:{
     *              codes: [1, 2, 3]
     *         },
     *         value2: 2
     *     }
     * </pre>
     */
    String jsonwrap() default "";
    
    /**
     * API 字段名
     *
     * @return
     */
    String value();
    
    /**
     * 是否必须
     *
     * @return
     */
    boolean required() default false;
    
    String name() default "";// 名称
    
    /**
     * 示例值
     *
     * @return 示例值
     */
    String example() default "";//
    
    String desc() default "";// 描述信息
    
    
    //================================================================
    // 仅限于数值类型
    //================================================================
    
    
    /**
     * 最小值, 仅限于数值类型
     */
    String min() default "";
    
    /**
     * 最大值
     * <p>
     * 仅限于数值类型
     */
    String max() default "";
    
    //================================================================
    // 最小长度 & 最大长度仅限于 字符串 活儿数组 字节大小等内容
    //================================================================
    
    /**
     * 最小长度
     */
    int minLength() default 0;
    
    /***
     * @return 最大长度, 默认-1 无穷大
     */
    int maxLength() default -1;
    
    String jsonWrapAs() default "";
    
    // 转 JSON 时 包裹类型 默认 对象类型
    public WrapType jsonWrapType() default WrapType.OBJ;
    
    public static enum WrapType {
        /**
         * 对象类型
         */
        OBJ,
        
        /**
         * 数组类型
         */
        ARRAY,
    }
}
